package cn.akwangl.builder;

/**
 * 作者：阿坤
 * 创建时间：8:34 2019/8/16
 * 功能描述：
 *
 *
 * 优点：
 * （1）生成器模式将对象的构造过程封装在具体生成器中，用户使用不同的具体生成器就可以得到该对象的不同表示。
 * （2）生成器模式将对象的构造过程从创建该对象的类中分离出来，是用户无须了解该对象的具体组件。
 * （3）可以更加精细有效地控制对象的构造过程。生成器将对象的构造过程分解成若干个步骤，这就使程序可以更加精细，有效地控制整个对象的构造。
 * （4）生成器模式将对象的构造过程与创建该对象类解耦，使对象的创建更加灵活有弹性。
 * （5）当增加新的具体生成器时，不必修改指挥者的代码，即该模式满足开-闭原则。
 *
 * 适合使用生成器模式的情景：
 *  （1）当系统准备为用户提供一个内部结构复杂的对象，而且在构造方法中编写创建该对象的代码无法满足用户需求时，就可以使用生成器模式来构造这样的对象。
 *  （2）当某些系统要求对象的构造过程必须独立于创建该对象的类时。
 *
 *  生成器模式的使用：
 *      这个简单的问题就是创建含有按钮、标签和文本框组件的容器。不同用户对容器有不同的要求，
 *      比如某些用户希望容器中只含有按钮和标签，某些用户希望容器中只含有按钮和文本框。
 *      另外，用户对组件在容器中的顺序位置也有不同的要求，
 *      比如某些用户要求组件在容器中从左至右的排列顺序是按钮、标签、文本框，
 *      而某些用户要求从左到右的排列顺序是标签、文本框、按钮等。
 * 显然不能在容器的构造方法中编写有关创建按钮、标签和文本框的代码，
 * 也不能编写排列这些组件位置的代码。以下使用生成器为用户创建所需要的容器，
 */
public class Test {
    public static void main(String args[]){
        MyDate date = new MyDate();
        IDateBuilder builder;
        builder = new DateBuilder1(date).buildDate(2066, 3, 5);
        System.out.println(builder.date());
        builder = new DateBuilder2(date).buildDate(2066, 3, 5);
        System.out.println(builder.date());
    }
}
